#键值映射的数据结构  key-value
#无序
#可变数据类型

#字典的key -- 天生去重
#key 必须是可hash对象    -- 不可变数据类型
#value可以是任何值

#字典的定义
#>>> d1 = {"a":1, "b":2, "a":4}
# >>> d1
# {'a': 4, 'b': 2}
# >>> d1 = {1:"3"}
# >>> d1[1]
# '3'
# >>> d1 = { (1,2) : "abc" }
# >>> d1
# {(1, 2): 'abc'}
# >>> d1[(1,2)]
# 'abc'
# >>> d1 = { [1,2]: "abc" }
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: unhashable type: 'list'

# #字典的取值
# print(d1["name"])
# print(d1["xxx"])  #没有这个key会抛出异常
# print("end.....")

#get属性获取值， 如果找不到这个key 它不会报错
#get还可以设置默认值
# d1 = {"a":1, "b":2}
# # print( dir(d1) )
# print( d1.get("a") )
# print( d1.get("xx") )  #没有取到xx的值，默认返回None
# print( d1.get("xx", 10))  # 没有取到xx的值，默认返回10
# print( d1.get("b", 20))  #取到了b的值，就返回b的值2

#新增和修改
#key存在就是修改
#key不存在就是新增
# d1["c"] = 3
# print( d1.get("c") )
# d1["a"] = 10
# print(d1.get("a"))

#从键盘输入任意字符串，统计每个字符出现的次数。结果保存在字典里
#aoierfweaaa  --> {"a":4, "o":1}
# input_str = input("input:")
# dic = {}
# for i in input_str:
#     dic[i] = dic.get(i, 0) + 1
# print(dic)

# #遍历
# d1 = {"a":1, "b":3, "c":5}
# for i in d1:
#     print(i)
#
# for i in d1.items():
#     print(i)
#
# for k,v in d1.items():
#     print(f"{k} --> {v}")
#
# #成员关系判断 -- 默认情况下判断key
# print("a" in d1)
# print(1 in d1)
# print( d1.values() )
# print(1 in d1.values() )
# print (d1.keys())

#学生信息   姓名，年龄，爱好
#写一个信息管理系统
#1、添加学生信息
#   姓名，年龄、爱好
#2、查询学生信息
#  输入名字  -- 展示爱好，年龄
#无限制添加、查看 按q退出
# lst = [["zhangsan",18,"football"],
#        ["李四", 19, "reading"]]
# d1 = {"zhangsan": [16, "football"],
#       "lisi":[17, "music"]}

# d2 = {"zhangsan": {"age":16, "hobby":"football"},
#       "wanger": {"age":18, "hobby":"music"}}

# stuinfo = {}
#
# print("1、添加学生信息:")
# print("2、查询学生信息")
# while 1:
#     choice = input("请输入你的选择:")
#     if choice == "q":
#         break
#     elif choice == "1":
#         name, age, hobby = input("请输入你的名字、年龄、爱好(空白分割)").split()
#         stuinfo[name] = {"age":age, "hobby": hobby}
#     elif choice == "2":
#         name = input("请输入你的名字:")
#         print(f"{name}的年龄是{stuinfo[name]['age']},爱好是{stuinfo[name]['hobby']}")
#     else:
#         print("输入有误！请重新输入")

#程序运行起来 注册信息 -- 内存  程序退出内存就清空了
#固化   -- 磁盘
#数据序列化  内存中（字典 -- 数据结构）  --字符串，存在硬盘文件中

#json格式   轻量级的数据交换格式
# import json
# #dict -- > str
# d1 ={"zhangsan":{"age":18, "hobby":"basketball"},
#      "lisi":{"age":18, "hobby":"music"}}
# d1_str = json.dumps(d1)
# print(d1_str)
# print(type(d1_str))
#
# #str --> dict
# d2 = json.loads(d1_str)
# print(d2)
# print(type(d2))
#
# #open 打开文件
# fp = open("stuinfo.txt","w")
# fp.write(d1_str)
# fp.close()
#
# #读取
# fp = open("stuinfo.txt")
# d2_str = fp.read()
# print(d2_str, type(d2_str))
# fp.close()
# d2 = json.loads(d2_str)
# print(f"d2 的类型是:",type(d2))


# import json
#
# stuifo = {}
#
# print("1、添加学生信息：\n2、查询学生信息")
#
#
# while 1:
#     choice = input("输入选择")
#     if choice == "q":
#         break
#     elif choice == "1":
#         name,age,hobby = input("输入名字、年龄、爱好：").split()
#         stuifo[name] = {"age":age , "hobby":hobby}
#         stuifo_str = json.dumps(stuifo)
#         fp = open("stuinfo.txt", "w")
#         fp.write(stuifo_str)
#         fp.close()
#         continue
#     elif choice == "2":
#
#         fp= open("stuinfo.txt")
#         stuifo_str = fp.read()
#         stuifo = json.loads(stuifo_str)
#         fp.close()
#         name = input("输入你的名字：")
#         print(f"{name}的年龄是{stuifo[name]['age']}，爱好是{stuifo[name]['hobby']}")
#     else:
#         print("输入有误！重新输入")

#哈希算法
#把任意长度的输入变成固定长度的输出

#md5 、sha1 、sha2 、sha256、 sha512
#1、单向加密算法
#2、明文一样，密文一定也一样
#密文一样，明文可能不一样，但是这个概率非常小，忽略不计

#1、验证完整性、防止篡改
#2、认证

##############删除操作
#1、dict.pop()
#2、dict.popitem()

#d1 = {"a":1, "b":2, "c":3}
# d1.pop("a")
# Out[3]: 1
# d1
# Out[4]: {'b': 2, 'c': 3}

# d1
# Out[6]: {'b': 2, 'c': 3}
# d1.popitem()
# Out[7]: ('c', 3)
# d1
# Out[8]: {'b': 2}

#两个字典的合并
# d1 = {"a":1, "b":2}
# d2 = {"c":3, "d":4}
# d1.update(d2)  #改变d1的内容，将d2合并进去
# print(d1)

#生成新字典合并
# d3 = dict(d1, **d2)
# print(d3)

#容器类型的转换
# list('abc')
# Out[9]: ['a', 'b', 'c']
# list( range(10) )
# Out[10]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# list( ("a",1) )
# Out[11]: ['a', 1]
# list( {"a":1, "b":2} )
# Out[12]: ['a', 'b']
# tuple([1,2])
# Out[13]: (1, 2)
# dict( [("a",1), ("b",2), ("c", 3)] )
# Out[14]: {'a': 1, 'b': 2, 'c': 3}